/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package mundial;

import java.util.ArrayList;

import java.util.List;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;
import org.jgap.Chromosome;
import org.jgap.Configuration;
import org.jgap.DefaultFitnessEvaluator;
import org.jgap.Gene;
import org.jgap.Genotype;
import org.jgap.IChromosome;
import org.jgap.impl.DefaultConfiguration;
import org.jgap.impl.IntegerGene;
import org.jgap.impl.SwappingMutationOperator;

/**
 *
 * @author Jorge Mejia
 */
public class TestMundialFitness {

    private Configuration conf;
    private SwappingMutationOperator swapper;
    private MundialFitnessFunction fitnessFunction = null;
    public List equipos = new ArrayList();
    public List ranking = new ArrayList();
    private List resultado = new ArrayList();
    private String solucion;
   private String solucion2;

    private static final int MAX_ALLOWED_EVOLUTIONS = 2000;
    private Chromosome equipoChromosome = null;

    public void initialize(String tipoPartidos) throws Exception {
        StringTokenizer st = new StringTokenizer(tipoPartidos);

        while (st.hasMoreElements()) {
            String genre = st.nextToken();
            ranking.add(genre);
        }

        equipos = this.loadEquipos();

        conf = new DefaultConfiguration();
        Configuration.resetProperty(Configuration.PROPERTY_FITEVAL_INST);
        conf.setFitnessEvaluator(new DefaultFitnessEvaluator());
        conf.getGeneticOperators().clear();

        swapper = new SwappingMutationOperator(conf);
        conf.addGeneticOperator(swapper);
        conf.setPreservFittestIndividual(true);
        conf.setPopulationSize(1000);
        conf.setKeepPopulationSizeConstant(false);

        fitnessFunction = new MundialFitnessFunction(equipos, ranking);
     
        
        conf.setFitnessFunction(fitnessFunction);
      
        Gene[] equiposGenes = new Gene[4];

        equiposGenes[0] = new IntegerGene(conf, 0,  equipos.size() - 1);
        equiposGenes[1] = new IntegerGene(conf, 0, equipos.size() - 1);
        equiposGenes[2] = new IntegerGene(conf, 0, equipos.size() - 1);
        equiposGenes[3] = new IntegerGene(conf, 0, equipos.size() - 1);
         
        equipoChromosome = new Chromosome(conf, equiposGenes);
        equiposGenes[0].setAllele(new Integer(0));
        equiposGenes[1].setAllele(new Integer(1));
        equiposGenes[2].setAllele(new Integer(2));
        equiposGenes[3].setAllele(new Integer(3));
        conf.setSampleChromosome(equipoChromosome);

    }

    public String getSolucion2() {
        return solucion2;
    }

    public void setSolucion2(String solucion2) {
        this.solucion2 = solucion2;
    }
    

    public List getResultado() {
        return resultado;
    }

    public void setResultado(List resultado) {
        this.resultado = resultado;
    }

    public String getSolucion() {
        return solucion;
    }

    public void setSolucion(String solucion) {
        this.solucion = solucion;
    }

    private List loadEquipos() {
        equipoMundial em=new equipoMundial();
        List list = new ArrayList(em.getList());
        
        em.getEntityManager().getTransaction().commit();
        em.getList();
        list=em.getList();
        return list;

    }

    public void testSelectFittestPartidos() throws Exception {

        equipos = this.loadEquipos();
        System.out.println(equipos);
        Genotype population = Genotype.randomInitialGenotype(conf);

        IChromosome bestSolutionSoFar = equipoChromosome;
       
        for (int i = 0; i < MAX_ALLOWED_EVOLUTIONS; i++) {
            population.evolve();
            IChromosome candidateBestSolution = population.getFittestChromosome();

            if (candidateBestSolution.getFitnessValue() > bestSolutionSoFar.getFitnessValue()) {
                bestSolutionSoFar = candidateBestSolution;
                System.out.println(population.getFittestChromosome().getGene(i).getConfiguration().getName());
            }
        }
      
        printSolution(bestSolutionSoFar, equipos);
        solucion2=String.valueOf(bestSolutionSoFar);
        
    }

    public void printSolution(IChromosome solution, List equipos) {
        //System.out.println("#################################################################################################################");
        //System.out.println("Valor del Fitness: " + solution.getFitnessValue());
        solucion=String.valueOf(solution.getFitnessValue());

        //System.out.println(solucion);
        for (int i = 0; i < solution.size(); i++) {
            int index = (Integer) solution.getGene(i).getAllele();
            RankingFifa equipo = (RankingFifa) equipos.get(index);
            resultado.add(equipo.getNombre().toString());
         
            //System.out.println(equipo.getNombre().toString());
          
        }
       // JOptionPane.showMessageDialog(null, resultado);
       // System.out.println(resultado);
        
       // System.out.println("#################################################################################################################");
    }
    
}
